home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigantic Games 2
/
Gigantic Games 2.iso
/
pc
/
_w_
/
wordsearch
/
src
/
wsearch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-23
|
5KB
|
255 lines
#include <exec/types.h>
#include <stdio.h>
#include "wsearch.h"
void next();
char *wptr[MAXWORD];
extern int LINK;
int wsearch()
{
int i,j,ls;
char *temp;
for(i=0;i<MAXWORD;i++)
wptr[i] = word[i];
ls=MAXWORD-1;
while(ls>0)
{
j=0;
for(i=0;i<ls;i++)
{
if(strlen(wptr[i])<strlen(wptr[i+1]))
{
j=i;
temp = wptr[i];
wptr[i] = wptr[i+1];
wptr[i+1] = temp;
}
}
ls = j;
}
w=MAXWORD-1;
while((wptr[w])[0]==0 && w!=-1)
w--;
if(w==-1) return(0);
open_requestor();
i = setword(0);
close_requestor();
return(i);
}
int setword(pos)
int pos;
{
char buffer[MAXSIZE+1];
int x,y,d,x0,y0,d0,s;
static int error,i;
int link; /* indicate position must link with other words */
link = LINK;
x = randint(px);
y = randint(py);
d = randint(7);
while((1<<d & filter) == 0)
{
d = d + 1;
if(d>7) d=0;
}
s = 0;
do
{
if(Stop_Flag()) return(-1);
if(link==1)
{
error = advance(&x,&y,&d,pos,link);
if(error!=0)
{
link = 0;
error = advance(&x,&y,&d,pos,link);
}
}
else error = advance(&x,&y,&d,pos,link);
if(error!=0) return(1);
if(s==0)
{
s = 1;
x0 = x;
y0 = y;
d0 = d;
}
buffer[strlen((wptr[pos]))] = NULL;
for(i=0;i<strlen((wptr[pos]));i++)
{
if(d==0)
{
buffer[i]=Key(x+i,y);
Key(x+i,y)=(wptr[pos])[i];
}
else if(d==1)
{
buffer[i]=Key(x+i,y+i);
Key(x+i,y+i)=(wptr[pos])[i];
}
else if(d==2)
{
buffer[i]=Key(x,y+i);
Key(x,y+i)=(wptr[pos])[i];
}
else if(d==3)
{
buffer[i]=Key(x-i,y+i);
Key(x-i,y+i)=(wptr[pos])[i];
}
else if(d==4)
{
buffer[i]=Key(x-i,y);
Key(x-i,y)=(wptr[pos])[i];
}
else if(d==5)
{
buffer[i]=Key(x-i,y-i);
Key(x-i,y-i)=(wptr[pos])[i];
}
else if(d==6)
{
buffer[i]=Key(x,y-i);
Key(x,y-i)=(wptr[pos])[i];
}
else if(d==7)
{
buffer[i]=Key(x+i,y-i);
Key(x+i,y-i)=(wptr[pos])[i];
}
}
if(pos<w)
error=setword(pos+1);
else error = 0;
if(error==0) return(0);
for(i=0;i<strlen((wptr[pos]));i++)
{
if(d==0)
Key(x+i,y)=buffer[i];
else if(d==1)
Key(x+i,y+i)=buffer[i];
else if(d==2)
Key(x,y+i)=buffer[i];
else if(d==3)
Key(x-i,y+i)=buffer[i];
else if(d==4)
Key(x-i,y)=buffer[i];
else if(d==5)
Key(x-i,y-i)=buffer[i];
else if(d==6)
Key(x,y-i)=buffer[i];
else if(d==7)
Key(x+i,y-i)=buffer[i];
}
next(&x,&y,&d);
advance(&x,&y,&d,pos);
if(x==x0 && y==y0 && d==d0) return(1);
s = 1;
}
while(error!=0);
return(0);
}
void next(x,y,d)
int *x,*y,*d;
{
*x = *x + 1;
if(*x>px)
{
*x = 0;
*y = *y + 1;
}
if(*y>py)
{
*x = 0;
*y = 0;
*d = *d + 1;
}
if(*d>7)
{
*x = 0;
*y = 0;
*d = 0;
}
while((1<<*d & filter) == 0)
{
*d = *d + 1;
if(*d>7) *d=0;
}
}
int advance(x,y,d,pos,link)
int *x,*y,*d,pos,link;
{
int x0,y0,d0,i,x1,y1;
x0=*x;y0=*y;d0=*d;
for(i=0;i<strlen(wptr[pos]);)
{
if(*d==0||*d==1||*d==7)
x1=*x+i;
else if(*d==3||*d==4||*d==5)
x1=*x-i;
else
x1=*x;
if(*d==1||*d==2||*d==3)
y1=*y+i;
else if(*d==5||*d==6||*d==7)
y1=*y-i;
else
y1=*y;
if((Key(x1,y1)!=' ' && (wptr[pos])[i]!=Key(x1,y1))||
x1<0 || x1>px || y1<0 || y1>py)
{
i = 0;
if(link!=0) link=1;
next(x,y,d);
if(x0==*x && y0==*y && d0==*d) return(1);
}
else
{
if(link==1 && (wptr[pos])[i]==Key(x1,y1)) link = -1;
/* the link is used to indicate both if a link was requested (not 0)
and if the current position does link (-1)
*/
i = i + 1;
}
if(link==1 && i==strlen(wptr[pos])) /* finished word but no link */
{
i = 0;
next(x,y,d);
if(x0==*x && y0==*y && d0==*d) return(1);
}
}
return(0);
}